'''
该项目用于：
    1. 标记某一个东西的模式，使用json标记，将该文件与json文件一同使用zip打包
    2. 识别某一个东西的模式，更新到模式记录中
'''


import os



class Ma:
    '''模式匹配自动机'''
    def __init__(self, mtch, **kwargs) -> None:
        '''

        mtch: 模式匹配回调函数，必须传入

        cndt: condition回调函数，预检查条件，默认不进行任何检查

        ref: reflex回调函数，反射行为，默认不进行任何反射

        '''
        self.mtch = mtch
        self.mthd = kwargs
    
    def test(self, obj) -> bool:
        '''进行模式匹配测试的函数'''

        # 预检查条件
        if 'cndt' in self.mthd:
            cndt = self.mthd.get('cndt')
            if not cndt(obj):
                return False  # 在cpp中一般认为异常处理会拖慢执行速度
            
        # 实施模式匹配
        if not self.mtch(obj):
            return False
        else:
            ref = self.mthd.get('ref')
            ref(obj)  # 进行反射操作
            return True

    class SolExp(Exception):
        '''解决方案异常类'''
        def __init__(self, msg: str):
            super.__init__(self, msg)
        def __str__(self):
            return super.__str__(self)

    class InvalidData(SolExp):
        '''非法数据'''
        def __init__(self, msg: str):
            super.__init__(self, msg)
        def __str__(self):
            return super.__str__(self)
        
    class LossData(SolExp):
        '''数据丢失'''
        def __init__(self, msg: str):
            super.__init__(self, msg)
        def __str__(self):
            return super.__str__(self)
        


def import_mtchs(dirpath: str, filename: str):
    '''引入模式模块'''
    name = filename[:-3]
    mod = __import__(f'{dirpath}.{name}')
    this_mtch = getattr(mod, name)
    print(this_mtch.__dict__.keys())
    return this_mtch

def crt_ma(mod) -> Ma:
    '''创建模式匹配'''
    cllbck_mtch = getattr(mod, 'mtch')
    cllbck_cndt = getattr(mod, 'cndt')
    cllbck_ref = getattr(mod, 'ref')
    ma = Ma(cllbck_mtch, cndt=cllbck_cndt, ref=cllbck_ref)
    return ma

def cllct_mtchs(dirpath: str) -> list:
    '''收集模式目录'''
    arr = os.listdir(dirpath)
    ret = []
    for i in arr:
        if i.endswith('.py'):
            this_mtch = import_mtchs(dirpath, i)
            ma = crt_ma(this_mtch)
            ret.append(ma)
            print(f'imoprt: {i}')
    return ret

if __name__ == '__main__':
    '''进行模式匹配'''
    obj= {'data': ['1', 'unknow', '3']}
    obj= {'data': [2, 2, 34]}
    mtchs = cllct_mtchs('mtchs')
    for i in mtchs:
        i.test(obj)
    print(obj)
